<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // iterator是一种接口机制，为各种不同的数据结构提供统一的访问机制 主要供for of

        // 目的：在对象的原型对象上添加iterator接口后，for of可以遍历对象

        /* 
        Iterator 的遍历过程是这样的。
        （1）创建一个指针对象，指向当前数据结构的起始位置。也就是说，遍历器对象本质上，就是一个指针
        对象。
        （2）第一次调用指针对象的 next 方法，可以将指针指向数据结构的第一个成员。
        （3）第二次调用指针对象的 next 方法，指针就指向数据结构的第二个成员。
        （4）不断调用指针对象的 next 方法，直到它指向数据结构的结束位置。
        每一次调用 next 方法，都会返回数据结构的当前成员的信息。具体来说，就是返回一个包含 value 和 done 两个属性的对象。其中， value 属性是当前成员的值， done 属性是一个布尔值，表示遍历是否结
束。
        */
        // 加入target传入的是一个数组
     /*    function mockIterator(target){
            let index = 0;
            return {
                next(){
                    // 指针指过去 返回的是两个值 一个值当前的元素 另一个值标识数组是否结束
                    return index<target.length?{
                        value:target[index++],
                        done:false
                    }:{
                        value:target[index++],
                        done:true
                    }
                }
            }
        }
        let arr = [1,5,8,9];
        let objTest = mockIterator(arr);
        console.log(objTest.next());//value:1 done false
        console.log(objTest.next());
        console.log(objTest.next());
        console.log(objTest.next());
        console.log(objTest.next()); */

        // 想去将arr原型对象上的iterator替换成我们自己写 mockIterator
        /* function mockIterator(){
            // 函数没有调用但是当for of执行时 该函数执行调用了
            console.log(this);//当前遍历的对象
            let that = this;
            let index = 0;
            return {
                next(){
                    // 指针指过去 返回的是两个值 一个值当前的元素 另一个值标识数组是否结束
                    return index<that.length?{
                        value:that[index++],
                        done:false
                    }:{
                        value:that[index++],
                        done:true
                    }
                }
            }
        } 
        
         Array.prototype[Symbol.iterator] = mockIterator;
        let arr = [1,5,8,9];
        console.log(arr);

        for(let item of arr){
            console.log(item);
        }
        
        */

        // 控制 数组 控制 对象  如何判断是数组还是不是数组
        function mockIterator(){
            // 函数没有调用但是当for of执行时 该函数执行调用了
            console.log(this);//当前遍历的对象
            let that = this;
            let index = 0;
            if(Array.isArray(that)){
                return {
                    next(){
                        // 指针指过去 返回的是两个值 一个值当前的元素 另一个值标识数组是否结束
                        return index<that.length?{
                            value:that[index++],
                            done:false
                        }:{
                            value:that[index++],
                            done:true
                        }
                    }
                }
            }else{
                // 通过Object.keys去获取对象中key  
                let keys = Object.keys(that);
                return {
                    next(){
                        return index <keys.length ?{
                            value:that[keys[index++]],
                            done:false
                        }:{
                            value:that[keys[index++]],
                            done:true
                        }
                    }
                }
            }
            
        }
       
        Array.prototype[Symbol.iterator] = mockIterator;
        Object.prototype[Symbol.iterator] = mockIterator;
        let arr = [1,5,8,9];
        console.log(arr);

        for(let item of arr){
            console.log(item);
        }

        let obj = {
            name:'tom',
            age:10
        }
        for(let item of obj){
            console.log(item);
        }


        // console.log(Object.keys(obj));
        // that[keys[index++]],
        // 例如 that = obj
        // keys['name','age']
        // index keys数组的下标


        // obj.name  obj['name']

        // obj[keys[index++]]
        // that[keys[index++]]
    </script>
</body>
</html>